Part A:

Course Overview

The workshop is designed to give you an introduction on using Cytoscape – a network-based software application to perform bioinformatics pathway enrichment analysis. The particular use-case is that of RNA-seq data, but many of the concepts are used for other types of analysis. There are several reasons why we might want to use Cytoscpae in Bioinformatics:-
* You can be a non-programmer and want to analyse your biological datasets generated by “high-throughput sequencing”.

Cytoscape packages.

  • The packages within Cytoscape provides a user complete support for different types of “-Omics” datasets.
    • e.g. many NGS tools are developed for a Unix envi3
    +—————–speed than we have on our own machine
  • Some analyses take too long, and whilst they are running everything else on our machine will be slow
  • Eventually you will want to use “High-performance computing” (HPC) - but this requires some background knowledge before you can use it

Creating Network Graphs with Cytoscape

Cytoscape is a tool for viewing and analysing networks (meaning, in this case, any group of entities that are connected in some way). Cytoscape is not too hard to use, but it won’t make much sense unless you have a sense of some basic network analysis vocabulary and concepts. A glossary is made below for basic understanding of introduction to network graphs.

What is this?

These tutorials provide a basic introduction to using Cytoscape to conduct network analysis of biological data. They’re intended to be used with the data I collected about bladder cancer muscle invasive phenotype. However, anyone should be able to follow along.

Here’s what’s included:

  • Creating a basic Cytoscape network (that’s this tutorial)
  • Importing a node list and working with node attributes
  • Selecting parts of your network
  • Publishing your network diagram

In addition, you’ll likely need to manipulate your data in order to work with it. To that end, I’ve provided two tutorials to help you set up your data:

  • Preparing Data 1: Making an Edge List.
  • Preparing Data 2: Making a Node List from an Edge List.

Setting up your data

The most important thing to understand about Cytoscape (or, really, most network analysis tools) is the format in which you need to structure your data. At its most basic, Cytoscape wants a spreadsheet containing two columns. The objects in the first column should be connected in some way to the objects in the second column. This is called an edge list. In the example below, my edge list contains two kinds of things: geneA and geneB. The columns could be reordered so that the geneB column precedes the geneA column; it doesn’t matter. All that matters here is that each row in my spreadsheet describes a connection between two entities.

Other kinds of relationships you could describe in an edge list:
- Gene A appears in a pathway with Gene B.
- Gene A activates Pathway A.
- Gene B suppresses Pathway A.
… and on and on. The important thing here is that your edge list should contain a list of relationships between, at most, two kinds of entities (e.g., geneA and geneB, features and pathways). The nature of those relationships can differ. For example, Gene A could have up-regulated Pathway A, while Gene B down-regulates Pathway A. But there should be two different kinds of things, at most, described in two columns.

If you need specific guidance on setting up your edge list, see Preparing Data 1: Making an Edge List. This is just an example using actors and films as data. You can save your spreadsheet as an Excel document (with the file extension .xls) or its generic equivalent, a CSV (with the file extension .csv). Cytoscape can interpret both of these formats.

If you don’t have your own data, you can use the sample edgelist included in this tutorial below. (Use the “raw” download link or download the CSV directly.). This data was taken from our previous published article on bladder cancer muscle invasiveness link: https://content.iospress.com/articles/bladder-cancer/blc150024.





Get your edge list into Cytoscpae

Open up Cytoscape. You should be greeted with a welcome pane that looks something like the one below. (If not, read on for instructions on how to accomplish the same thing without the welcome screen.)


Start a new session From Network File. Somewhat confusingly, Cytoscape considers your edge list a “network file.” I guess it is a network, so maybe it’s not that confusing. Anyway, press the From Network File button and select the edge list you’ve prepared. You can also directly drag your .CSV file into Cytoscape network.



If you don’t see that welcome screen…

no big deal. Someone might have disabled it, but you can accomplish the same thing by clicking on the Import Network from File button (circled below) and selecting your edge list.



Help Cytoscape understand your data

The screen that pops up after you imported your edge list might be the most initially confusing part of Cytoscape, although it’s no problem once you figure out what it wants. You need to tell Cytoscape which parts of your data constitute the entities in your network diagram.

Cytoscape hasn’t understood right away that you want a network composed of geneA and geneB nodes. You can tell that’s the case because the icon that appears next to the words gene symbol A and Interaction Type looks sort of like a document, which means that Cytoscape thinks that you’ve fed it a list of edge attributes, not edges themselves. Edge attributes can come in handy, as I’ll explain below, but that’s not what you’ve provided Cytoscape at the moment.

We need to tell Cytoscape that the edge list we’ve provided contains Sources in one column and Targets in another. It doesn’t matter, in this case, which column you designate a source and which column you designate a target; it’s just that one column has to be one and the other has to be the other. (If our network was directed, this would matter, but that’s more information than you need right now.)

OK, let’s tell Cytoscape how to interpret our data. Click on the arrow next to the word Gene Symbol A and from the menu that appears, select the green circle. Cryptically, this icon means Source. For the Gene Symbol B column, do the same thing, but this time select the red bullseye, which means Target.

When you’ve changed both columns, click OK.



You have a (very confusing) network!

If the previous steps worked properly, you should have a network of connected nodes. If you have more than 100 or so, though, your network will look a lot like a hairball. We’ll talk about ways to make your network graph more legible in subsequent steps.
For now, note that you can zoom in on parts of your network using the magnifying glasses or your mouse. On a Mac, you can move your canvas around if you hold down the command key and drag. You can also search for individual nodes by using the search box at the upper right of the window. (Note that Cytoscape doesn’t zoom to the node you searched for right away; it just highlights it in yellow. You may have to zoom out to see the selected node.).

Switch up your style

One of the easiest ways to change the look of your network diagram is to switch the style using one of Cytoscape’s built-in options. To do that, click the Style tab on the control panel and then choose one of the options with which you’re presented. I don’t know if I love any of them, but some are more legible than others.



Change your layout

Sometimes networks are more legible if you change the arrangement of the nodes. You can do this by switching the layout. Click on Layout from Cytoscape’s menu bar and select one of the layout options. Experiment with various layouts and notice how drastically your network diagram changes.

Confoundingly, each of these wildly different network layouts displays the same basic information. How can this be? Simple: In most network graphs, the proximity of two nodes doesn’t indicate anything except legibility. This can be really confusing, because cognitively, we expect proximity to convey meaningful information. It just doesn’t, though, in most network diagrams. The presence or absence of an edge means something, and color and size often do, too. But proximity generally doesn’t.



Customize your style

You can make changes to many visual attributes of your network graph from Cytoscape’s control panel. Once you’ve selected the Style tab, look at the bottom of the control panel. You’ll see that three additional buttons allow you to customize the look of the nodes, the edges, and the network as a whole.

Looking at the Node style pane, you’ll see that we can alter many aspects of our nodes, including their border, the color, height, labels, etc. But what do the three columns, labeled Def., Map., and Byp. mean?

Def. stands for default: the default visual attribute of a node. If you click on the default fill color for your network diagram, for example (in the image below, it’s a blue square), you’ll see that you can swap out the colors of your network’s nodes.

Byp. stands for bypass, and it allows you to apply a style to a group of nodes that you select.

The Map. (mapping) column allows you to control the visual features of your nodes according to their properties. For example, let’s say you’d like all of the films from a particular studio to appear in pink. You can do that by mapping that attribute to a particular color. Or, let’s say you’d like those nodes with more connections to appear larger. You can do that with the mapping control.

The problem is, we don’t have any of that information currently included in our network. So in the next tutorial, we’ll look at how to load up attributes for our nodes.

(Or you can skip straight to publishing your network diagram!)





Saving your network

Cytoscape provides a number of ways to save results and visualizations: As a session: File → Save Session, File → Save Session As…



As an image: File → Export → Network to Image…







To the web: File → Export → Network to Web Page…
To a public repository: File → Export → Network to NDEx
As a graph format file: File → Export → Network to File.

Formats:
- CX JSON / CX2 JSON
- Cytoscape.js JSON
- GraphML
- PSI-MI
- XGMML
- SIF



This is the exercise session - Still in progress



Part B:

Author: Dr. Akshay Bhat

Last modified: 31st Jan 2024

RNA-Seq Data Network Analysis

Cytoscape is an open source software platform for integrating, visualizing, and analysing measurement data in the context of networks.

This protocol describes a network analysis workflow in Cytoscape for differentially expressed genes from an RNA-Seq experiment. Overall workflow:

• Finding a set of differentially expressed genes.
• Retrieving relevant networks from public databases.
• Integration and visualization of experimental data.
• Network functional enrichment analysis.
• Exporting network visualizations.

Setup

Install the (stringApp) from the Cytoscape App Store, or via Apps → App Store → Show App Store.

OR

Just visit the Cytoscape App store and install/download it from there.



Experimental Data

For this exercise, we will use a dataset comparing transcriptomic differences between bladder cancer and normal tissue. The study has been published by Radvanyi F et al., and we will get a summarized dataset with fold change and p-value from the EBI Gene Expression Atlas. Array-express ID is E-MTAB-1940.

• Download the data: Transcriptomic analysis of bladder cancer reveals convergent molecular pathology. (Here..!)
• To open the tsv datafile in Excel, first launch Excel and open a blank workbook. Next, go to Data → Get External Data → Import Text File….
• In the import wizard, select Delimited and in the next step select Tab.
• In the third step, you can select the Data Format for every column. The file has 4 columns of data: Gene ID, Gene Name, fold change and p-value. Make sure to change the format for the second column, Gene Name, to Text. You will have to scroll to the right to see the second column.
• Click Finish to complete the import.



Experimental Data

We are going to define a set of up-regulated genes from the full dataset by filtering for fold change and p-value.

• Select the row containing data value headers (row 4) and select Data → Filter.
• In the drop-down for the fold change column, set a filter for fold change greater than 2. This should result in 263 genes.
• Next, one would normally filter out non-significant changes by filtering on the p-value as well, for example setting p-value less than 0.05. But in this case, all genes with a fold change greater than 2 already meet that cutoff.
• With the filter active, select and copy all entries in the Gene Name column.




Retrieve Networks from STRING

To identify a relevant network, we will use the STRING database to find a network relevant to the list of up-regulated genes.

• Launch Cytoscape. In the Network Search bar at the top of the Network Panel, select STRING protein query from the drop-down, and paste in the list of 263 up-regulated genes.
• Open the options panel and confirm you are searching Homo sapiens with a Confidence cutoff of 0.40 and 0 Maximum additional interactors.
• Click the search icon to search. If any of the search terms are ambiguous, a Resolve Ambiguous Terms dialog will appear. Click Import to continue with the import using the default choices. The resulting network will load automatically, and should have around 173 nodes.




STRING Network Up-Regulated Genes

The resulting network contains up-regulated genes recognized by STRING, and interactions between them with a confidence score of 0.4 or greater.



The networks consist of one large connected component, several smaller networks, and some unconnected nodes. We will use only the largest connected component for the rest of the tutorial.

• To select the largest connected component, select Select → Nodes → Largest subnetwork.
• Select File → New Network → From Selected Nodes, All Edges.




Data Integration

Next we will import the RNA-Seq data and use them to create a visualization.

• Load the downloaded E-MTAB-1940-query-results.tsv file under File menu by selecting Import → Table from File….. Alternatively, drag and drop the data file directly onto the Node Table.
• In Advanced Options…, in the Ignore Lines Starting With field, enter #, to exclude the additional lines at the beginning of the data file.
• Select the query term column as the Key column for Network and select the Gene Name column as the key column by clicking on the header and selecting the key symbol.
• Click OK to import. Two new columns of data will be added to the Node Table.





Visualization

Next, we will create a visualization of the imported data on the network. For more detailed information on data visualization, see the Visualizing Data tutorial.

• In the Style tab of the Control Panel, switch the style from STRING style to default in the drop-down at the top.
• Change the default node Shape to ellipse and check Lock node width and height.
• Set the default node Size to 50.
• Set the default node Fill Color to light gray.
• Set the default Border Width to 2, and make the default Border Paint dark gray.





• For node Fill Color, create a continuous mapping for ‘NMIBC’ vs ‘normal’ .foldChange.
• Double-click the color mapping to open the Continuous Mapping Editor and click the Current Palette. Select the ColorBrewer yellow-orange-red shades gradient.
• Finally, for node Label, set a passthrough mapping for display name.
• Save your new visualization under Copy Style… in the Options menu of the Style interface, and name it de genes up.




Apply the Prefuse Force Directed layout by clicking the Apply Preferred Layout button in the toolbar. The network will now look something like this:



Exercise

STRING Enrichment

The STRING app has built-in enrichment analysis functionality, which includes enrichment for Gene Ontology, InterPro, KEGG Pathways, and PFAM.

• Using the STRING tab of the Results Panel, click the Functional Enrichment button. Keep the default settings. What do you see.



• When the enrichment analysis is complete, a new tab titled STRING Enrichment will open in the Table Panel.




The STRING app includes several options for filtering and displaying the enrichment results. The features are all available at the top of the STRING Enrichment tab. Filter the table to only show GO Biological Process.

Answer

• At the top left of the STRING enrichment tab, click the filter icon . Select GO Biological Process and check the Remove redundant terms check-box. Then click OK.
• Next, add a split donut chart to the nodes representing the top terms by clicking on
• Explore custom settings via in the top right of the STRING enrichment tab.




Exporting Networks

Cytoscape provides a number of ways to save results and visualizations:

• As a session: File → Save Session, File → Save Session As…
• As an image: File → Export → Network to Image…
• As a graph format file: File → Export → Network to File.
Formats:
CX JSON / CX2 JSON
Cytoscape.js JSON
GraphML

Save in any of the formats and be ready for publishing.





LS0tCnRpdGxlOiAiSW50cm9kdWN0aW9uIHRvIEN5dG9zY2FwZSBhbmQgaXQncyBBcHBzIC0gU2Vzc2lvbiAxIgphdXRob3I6ICJBa3NoYXkgQmhhdCIKZGF0ZTogJ2ByIGZvcm1hdChTeXMudGltZSgpLCAiTGFzdCBtb2RpZmllZDogJWQgJWIgJVkiKWAnCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazogCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIGNzczogc3R5bGVzaGVldHMvc3R5bGVzLmNzcwotLS0KPGltZyBzcmM9ImltYWdlcy9sb2dvLXNtLnBuZyIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0MHB4O3JpZ2h0OjEwcHg7IiB3aWR0aD0iMjAwIiAvPgoKIyBQYXJ0IEE6CgojIENvdXJzZSBPdmVydmlldwoKVGhlIHdvcmtzaG9wIGlzIGRlc2lnbmVkIHRvIGdpdmUgeW91IGFuIGludHJvZHVjdGlvbiBvbiB1c2luZyAqKkN5dG9zY2FwZSoqIOKAkyBhIG5ldHdvcmstYmFzZWQgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gcGVyZm9ybSBiaW9pbmZvcm1hdGljcyBwYXRod2F5IGVucmljaG1lbnQgYW5hbHlzaXMuIFRoZSBwYXJ0aWN1bGFyIHVzZS1jYXNlIGlzIHRoYXQgb2YgUk5BLXNlcSBkYXRhLCBidXQgbWFueSBvZiB0aGUgY29uY2VwdHMgYXJlIHVzZWQgZm9yIG90aGVyIHR5cGVzIG9mIGFuYWx5c2lzLiBUaGVyZSBhcmUgc2V2ZXJhbCByZWFzb25zIHdoeSB3ZSBtaWdodCB3YW50IHRvIHVzZSBDeXRvc2NwYWUgaW4gQmlvaW5mb3JtYXRpY3M6LSA8YnI+PC9icj4KKiBZb3UgY2FuIGJlIGEgbm9uLXByb2dyYW1tZXIgYW5kIHdhbnQgdG8gYW5hbHlzZSB5b3VyIGJpb2xvZ2ljYWwgZGF0YXNldHMgZ2VuZXJhdGVkIGJ5IOKAnGhpZ2gtdGhyb3VnaHB1dCBzZXF1ZW5jaW5n4oCdLgoKIyMgQ3l0b3NjYXBlIHBhY2thZ2VzLgoqIFRoZSBwYWNrYWdlcyB3aXRoaW4gQ3l0b3NjYXBlIHByb3ZpZGVzIGEgdXNlciBjb21wbGV0ZSBzdXBwb3J0IGZvciBkaWZmZXJlbnQgdHlwZXMgb2Yg4oCcLU9taWNz4oCdIGRhdGFzZXRzLiAKICAqCWUuZy4gbWFueSBOR1MgdG9vbHMgYXJlIGRldmVsb3BlZCBmb3IgYSBVbml4IGVudmkzCiAgCiAgKy0tLS0tLS0tLS0tLS0tLS0tc3BlZWQgdGhhbiB3ZSBoYXZlIG9uIG91ciBvd24gbWFjaGluZQoqCVNvbWUgYW5hbHlzZXMgdGFrZSB0b28gbG9uZywgYW5kIHdoaWxzdCB0aGV5IGFyZSBydW5uaW5nIGV2ZXJ5dGhpbmcgZWxzZSBvbiBvdXIgbWFjaGluZSB3aWxsIGJlIHNsb3cKKglFdmVudHVhbGx5IHlvdSB3aWxsIHdhbnQgdG8gdXNlIOKAnEhpZ2gtcGVyZm9ybWFuY2UgY29tcHV0aW5n4oCdIChIUEMpIC0gYnV0IHRoaXMgcmVxdWlyZXMgc29tZSBiYWNrZ3JvdW5kIGtub3dsZWRnZSBiZWZvcmUgeW91IGNhbiB1c2UgaXQKCgojIENyZWF0aW5nIE5ldHdvcmsgR3JhcGhzIHdpdGggQ3l0b3NjYXBlCgoqKkN5dG9zY2FwZSoqIGlzIGEgdG9vbCBmb3Igdmlld2luZyBhbmQgYW5hbHlzaW5nIG5ldHdvcmtzIChtZWFuaW5nLCBpbiB0aGlzIGNhc2UsIGFueSBncm91cCBvZiBlbnRpdGllcyB0aGF0IGFyZSBjb25uZWN0ZWQgaW4gc29tZSB3YXkpLiAqKkN5dG9zY2FwZSoqIGlzIG5vdCB0b28gaGFyZCB0byB1c2UsIGJ1dCBpdCB3b24ndCBtYWtlIG11Y2ggc2Vuc2UgdW5sZXNzIHlvdSBoYXZlIGEgc2Vuc2Ugb2Ygc29tZSBiYXNpYyBuZXR3b3JrIGFuYWx5c2lzIHZvY2FidWxhcnkgYW5kIGNvbmNlcHRzLiBBIGdsb3NzYXJ5IGlzIG1hZGUgYmVsb3cgZm9yIGJhc2ljIHVuZGVyc3RhbmRpbmcgb2YgaW50cm9kdWN0aW9uIHRvIG5ldHdvcmsgZ3JhcGhzLiAKCioJaHR0cHM6Ly9naXRodWIuY29tL21pcmlhbXBvc25lci9uZXR3b3JrX2FuYWx5c2lzX3dvcmtzaG9wL2Jsb2IvbWFzdGVyL3NvY2lhbC1uZXR3b3JrLWdsb3NzYXJ5Lm1kCioJaHR0cHM6Ly9qb3VybmFsb2ZkaWdpdGFsaHVtYW5pdGllcy5vcmcvMS0xL2RlbXlzdGlmeWluZy1uZXR3b3Jrcy1ieS1zY290dC13ZWluZ2FydC8KCgojIyBXaGF0IGlzIHRoaXM/CgpUaGVzZSB0dXRvcmlhbHMgcHJvdmlkZSBhIGJhc2ljIGludHJvZHVjdGlvbiB0byB1c2luZyAqKkN5dG9zY2FwZSoqIHRvIGNvbmR1Y3QgbmV0d29yayBhbmFseXNpcyBvZiBiaW9sb2dpY2FsIGRhdGEuIFRoZXkncmUgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIHRoZSBkYXRhIEkgY29sbGVjdGVkIGFib3V0IGJsYWRkZXIgY2FuY2VyIG11c2NsZSBpbnZhc2l2ZSBwaGVub3R5cGUuIEhvd2V2ZXIsIGFueW9uZSBzaG91bGQgYmUgYWJsZSB0byBmb2xsb3cgYWxvbmcuCgojIyBIZXJlJ3Mgd2hhdCdzIGluY2x1ZGVkOgoqCUNyZWF0aW5nIGEgYmFzaWMgKipDeXRvc2NhcGUgbmV0d29yayoqICh0aGF0J3MgdGhpcyB0dXRvcmlhbCkKKglJbXBvcnRpbmcgYSBub2RlIGxpc3QgYW5kIHdvcmtpbmcgd2l0aCBub2RlIGF0dHJpYnV0ZXMKKglTZWxlY3RpbmcgcGFydHMgb2YgeW91ciBuZXR3b3JrIAoqCVB1Ymxpc2hpbmcgeW91ciBuZXR3b3JrIGRpYWdyYW0KCkluIGFkZGl0aW9uLCB5b3UnbGwgbGlrZWx5IG5lZWQgdG8gbWFuaXB1bGF0ZSB5b3VyIGRhdGEgaW4gb3JkZXIgdG8gd29yayB3aXRoIGl0LiBUbyB0aGF0IGVuZCwgSSd2ZSBwcm92aWRlZCB0d28gdHV0b3JpYWxzIHRvIGhlbHAgeW91IHNldCB1cCB5b3VyIGRhdGE6CgoqCSoqUHJlcGFyaW5nIERhdGEgMToqKiBNYWtpbmcgYW4gRWRnZSBMaXN0LgoqCSoqUHJlcGFyaW5nIERhdGEgMioqOiBNYWtpbmcgYSBOb2RlIExpc3QgZnJvbSBhbiBFZGdlIExpc3QuCgojIFNldHRpbmcgdXAgeW91ciBkYXRhClRoZSBtb3N0IGltcG9ydGFudCB0aGluZyB0byB1bmRlcnN0YW5kIGFib3V0IEN5dG9zY2FwZSAob3IsIHJlYWxseSwgbW9zdCBuZXR3b3JrIGFuYWx5c2lzIHRvb2xzKSBpcyB0aGUgZm9ybWF0IGluIHdoaWNoIHlvdSBuZWVkIHRvIHN0cnVjdHVyZSB5b3VyIGRhdGEuIEF0IGl0cyBtb3N0IGJhc2ljLCBDeXRvc2NhcGUgd2FudHMgYSBzcHJlYWRzaGVldCBjb250YWluaW5nIHR3byBjb2x1bW5zLiBUaGUgb2JqZWN0cyBpbiB0aGUgZmlyc3QgY29sdW1uIHNob3VsZCBiZSBjb25uZWN0ZWQgaW4gc29tZSB3YXkgdG8gdGhlIG9iamVjdHMgaW4gdGhlIHNlY29uZCBjb2x1bW4uIFRoaXMgaXMgY2FsbGVkIGFuICoqZWRnZSBsaXN0KiouIEluIHRoZSBleGFtcGxlIGJlbG93LCBteSBlZGdlIGxpc3QgY29udGFpbnMgdHdvIGtpbmRzIG9mIHRoaW5nczogKipnZW5lQSoqIGFuZCAqKmdlbmVCLioqIFRoZSBjb2x1bW5zIGNvdWxkIGJlIHJlb3JkZXJlZCBzbyB0aGF0IHRoZSBnZW5lQiBjb2x1bW4gcHJlY2VkZXMgdGhlIGdlbmVBIGNvbHVtbjsgaXQgZG9lc24ndCBtYXR0ZXIuIEFsbCB0aGF0IG1hdHRlcnMgaGVyZSBpcyB0aGF0IGVhY2ggcm93IGluIG15IHNwcmVhZHNoZWV0IGRlc2NyaWJlcyBhIGNvbm5lY3Rpb24gYmV0d2VlbiB0d28gZW50aXRpZXMuCgpPdGhlciBraW5kcyBvZiByZWxhdGlvbnNoaXBzIHlvdSBjb3VsZCBkZXNjcmliZSBpbiBhbiBlZGdlIGxpc3Q6PGJyPjwvYnI+Ci0JKipHZW5lIEEqKiBhcHBlYXJzIGluIGEgcGF0aHdheSB3aXRoICoqR2VuZSBCKiouPGJyPjwvYnI+Ci0JKipHZW5lIEEqKiBhY3RpdmF0ZXMgKipQYXRod2F5IEEuKio8YnI+PC9icj4KLQkqKkdlbmUgQioqIHN1cHByZXNzZXMgKipQYXRod2F5IEEuKio8YnI+PC9icj4KLi4uIGFuZCBvbiBhbmQgb24uIFRoZSBpbXBvcnRhbnQgdGhpbmcgaGVyZSBpcyB0aGF0IHlvdXIgZWRnZSBsaXN0IHNob3VsZCBjb250YWluIGEgbGlzdCBvZiByZWxhdGlvbnNoaXBzIGJldHdlZW4sIGF0IG1vc3QsIHR3byBraW5kcyBvZiBlbnRpdGllcyAoZS5nLiwgZ2VuZUEgYW5kIGdlbmVCLCBmZWF0dXJlcyBhbmQgcGF0aHdheXMpLiBUaGUgbmF0dXJlIG9mIHRob3NlIHJlbGF0aW9uc2hpcHMgY2FuIGRpZmZlci4gRm9yIGV4YW1wbGUsIEdlbmUgQSBjb3VsZCBoYXZlIHVwLXJlZ3VsYXRlZCBQYXRod2F5IEEsIHdoaWxlIEdlbmUgQiBkb3duLXJlZ3VsYXRlcyBQYXRod2F5IEEuIEJ1dCB0aGVyZSBzaG91bGQgYmUgdHdvIGRpZmZlcmVudCBraW5kcyBvZiB0aGluZ3MsIGF0IG1vc3QsIGRlc2NyaWJlZCBpbiB0d28gY29sdW1ucy4KCklmIHlvdSBuZWVkIHNwZWNpZmljIGd1aWRhbmNlIG9uIHNldHRpbmcgdXAgeW91ciBlZGdlIGxpc3QsIHNlZSBQcmVwYXJpbmcgRGF0YSAxOiBNYWtpbmcgYW4gRWRnZSBMaXN0LiBUaGlzIGlzIGp1c3QgYW4gZXhhbXBsZSB1c2luZyBhY3RvcnMgYW5kIGZpbG1zIGFzIGRhdGEuCllvdSBjYW4gc2F2ZSB5b3VyIHNwcmVhZHNoZWV0IGFzIGFuIEV4Y2VsIGRvY3VtZW50ICh3aXRoIHRoZSBmaWxlIGV4dGVuc2lvbiAueGxzKSBvciBpdHMgZ2VuZXJpYyBlcXVpdmFsZW50LCBhIENTViAod2l0aCB0aGUgZmlsZSBleHRlbnNpb24gLmNzdikuIEN5dG9zY2FwZSBjYW4gaW50ZXJwcmV0IGJvdGggb2YgdGhlc2UgZm9ybWF0cy4KIDxicj48L2JyPiA8YnI+PC9icj4KSWYgeW91IGRvbid0IGhhdmUgeW91ciBvd24gZGF0YSwgeW91IGNhbiB1c2UgdGhlIHNhbXBsZSBlZGdlbGlzdCBpbmNsdWRlZCBpbiB0aGlzIHR1dG9yaWFsIGJlbG93LiAoW1VzZSB0aGUgInJhdyIgZG93bmxvYWQgbGluayBvciBkb3dubG9hZCB0aGUgQ1NWIGRpcmVjdGx5Ll0oImh0dHBzOi8vZ2l0aHViLmNvbS9hMWFrcy9DeXRvc2NhcGVfQ291cnNlL2Jsb2IvbWFpbi9EYXRhX0ZpbGVzL2ludGVyYWN0aW9uc19kYXRhX0JsYWRkZXJDYW5jZXJfQUJoYXRldGFsLmNzdiIpKS4gVGhpcyBkYXRhIHdhcyB0YWtlbiBmcm9tIG91ciBwcmV2aW91cyBwdWJsaXNoZWQgYXJ0aWNsZSBvbiBibGFkZGVyIGNhbmNlciBtdXNjbGUgaW52YXNpdmVuZXNzIGxpbms6IGh0dHBzOi8vY29udGVudC5pb3NwcmVzcy5jb20vYXJ0aWNsZXMvYmxhZGRlci1jYW5jZXIvYmxjMTUwMDI0LiAgPGJyPjwvYnI+IDxicj48L2JyPgohW10oaW1hZ2VzL0ludGVyYWN0aW9uUGljLnBuZykKPGJyPjwvYnI+Cjxicj48L2JyPgo8YnI+PC9icj4KPGJyPjwvYnI+CgojIEdldCB5b3VyIGVkZ2UgbGlzdCBpbnRvIEN5dG9zY3BhZQpPcGVuIHVwIEN5dG9zY2FwZS4gWW91IHNob3VsZCBiZSBncmVldGVkIHdpdGggYSB3ZWxjb21lIHBhbmUgdGhhdCBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGUgb25lIGJlbG93LiAoSWYgbm90LCByZWFkIG9uIGZvciBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGFjY29tcGxpc2ggdGhlIHNhbWUgdGhpbmcgd2l0aG91dCB0aGUgd2VsY29tZSBzY3JlZW4uKQoKPGJyPjwvYnI+CgoKU3RhcnQgYSBuZXcgc2Vzc2lvbiAqKkZyb20gTmV0d29yayBGaWxlLioqIFNvbWV3aGF0IGNvbmZ1c2luZ2x5LCBDeXRvc2NhcGUgY29uc2lkZXJzIHlvdXIgZWRnZSBsaXN0IGEgIm5ldHdvcmsgZmlsZS4iIEkgZ3Vlc3MgaXQgaXMgYSBuZXR3b3JrLCBzbyBtYXliZSBpdCdzIG5vdCB0aGF0IGNvbmZ1c2luZy4gQW55d2F5LCBwcmVzcyB0aGUgKipGcm9tIE5ldHdvcmsgRmlsZSoqIGJ1dHRvbiBhbmQgc2VsZWN0IHRoZSBlZGdlIGxpc3QgeW91J3ZlIHByZXBhcmVkLiBZb3UgY2FuIGFsc28gZGlyZWN0bHkgZHJhZyB5b3VyIC5DU1YgZmlsZSBpbnRvIEN5dG9zY2FwZSBuZXR3b3JrLgo8YnI+PC9icj4KCiFbXShpbWFnZXMvU2Vzc2lvbl9DeXRvX0ludGVyYWN0aW9uLnBuZykKPGJyPjwvYnI+Cjxicj48L2JyPgo8ZGl2IGNsYXNzPSJpbmZvcm1hdGlvbiI+CiMgSWYgeW91IGRvbid0IHNlZSB0aGF0IHdlbGNvbWUgc2NyZWVuLi4uCm5vIGJpZyBkZWFsLiBTb21lb25lIG1pZ2h0IGhhdmUgZGlzYWJsZWQgaXQsIGJ1dCB5b3UgY2FuIGFjY29tcGxpc2ggdGhlIHNhbWUgdGhpbmcgYnkgY2xpY2tpbmcgb24gdGhlICoqSW1wb3J0IE5ldHdvcmsgZnJvbSBGaWxlKiogYnV0dG9uIChjaXJjbGVkIGJlbG93KSBhbmQgc2VsZWN0aW5nIHlvdXIgZWRnZSBsaXN0Lgo8L2Rpdj4KIVtdKGltYWdlcy9JbXBvcnRwaWMucG5nKQoKCjxicj48L2JyPgo8YnI+PC9icj4KCiMgSGVscCBDeXRvc2NhcGUgdW5kZXJzdGFuZCB5b3VyIGRhdGEKVGhlIHNjcmVlbiB0aGF0IHBvcHMgdXAgYWZ0ZXIgeW91IGltcG9ydGVkIHlvdXIgZWRnZSBsaXN0IG1pZ2h0IGJlIHRoZSBtb3N0IGluaXRpYWxseSBjb25mdXNpbmcgcGFydCBvZiBDeXRvc2NhcGUsIGFsdGhvdWdoIGl0J3Mgbm8gcHJvYmxlbSBvbmNlIHlvdSBmaWd1cmUgb3V0IHdoYXQgaXQgd2FudHMuIFlvdSBuZWVkIHRvIHRlbGwgQ3l0b3NjYXBlIHdoaWNoIHBhcnRzIG9mIHlvdXIgZGF0YSBjb25zdGl0dXRlIHRoZSBlbnRpdGllcyBpbiB5b3VyIG5ldHdvcmsgZGlhZ3JhbS4KPGJyPjwvYnI+Cjxicj48L2JyPgpDeXRvc2NhcGUgaGFzbid0IHVuZGVyc3Rvb2QgcmlnaHQgYXdheSB0aGF0IHlvdSB3YW50IGEgbmV0d29yayBjb21wb3NlZCBvZiAqKmdlbmVBKiogYW5kICoqZ2VuZUIqKiBub2Rlcy4gWW91IGNhbiB0ZWxsIHRoYXQncyB0aGUgY2FzZSBiZWNhdXNlIHRoZSBpY29uIHRoYXQgYXBwZWFycyBuZXh0IHRvIHRoZSB3b3JkcyAqKmdlbmUgc3ltYm9sIEEqKiBhbmQgKipJbnRlcmFjdGlvbiBUeXBlKiogbG9va3Mgc29ydCBvZiBsaWtlIGEgZG9jdW1lbnQsIHdoaWNoIG1lYW5zIHRoYXQgQ3l0b3NjYXBlIHRoaW5rcyB0aGF0IHlvdSd2ZSBmZWQgaXQgYSBsaXN0IG9mICoqZWRnZSBhdHRyaWJ1dGVzKiosIG5vdCBlZGdlcyB0aGVtc2VsdmVzLiBFZGdlIGF0dHJpYnV0ZXMgY2FuIGNvbWUgaW4gaGFuZHksIGFzIEknbGwgZXhwbGFpbiBiZWxvdywgYnV0IHRoYXQncyBub3Qgd2hhdCB5b3UndmUgcHJvdmlkZWQgQ3l0b3NjYXBlIGF0IHRoZSBtb21lbnQuCjxicj48L2JyPgo8YnI+PC9icj4KV2UgbmVlZCB0byB0ZWxsIEN5dG9zY2FwZSB0aGF0IHRoZSBlZGdlIGxpc3Qgd2UndmUgcHJvdmlkZWQgY29udGFpbnMgKipTb3VyY2VzKiogaW4gb25lIGNvbHVtbiBhbmQgKipUYXJnZXRzKiogaW4gYW5vdGhlci4gSXQgZG9lc24ndCBtYXR0ZXIsIGluIHRoaXMgY2FzZSwgd2hpY2ggY29sdW1uIHlvdSBkZXNpZ25hdGUgYSAqKnNvdXJjZSoqIGFuZCB3aGljaCBjb2x1bW4geW91IGRlc2lnbmF0ZSBhICoqdGFyZ2V0Kio7IGl0J3MganVzdCB0aGF0IG9uZSBjb2x1bW4gaGFzIHRvIGJlIG9uZSBhbmQgdGhlIG90aGVyIGhhcyB0byBiZSB0aGUgb3RoZXIuIChJZiBvdXIgbmV0d29yayB3YXMgKipkaXJlY3RlZCoqLCB0aGlzIHdvdWxkIG1hdHRlciwgYnV0IHRoYXQncyBtb3JlIGluZm9ybWF0aW9uIHRoYW4geW91IG5lZWQgcmlnaHQgbm93LikKPGJyPjwvYnI+Cjxicj48L2JyPgpPSywgbGV0J3MgdGVsbCBDeXRvc2NhcGUgaG93IHRvIGludGVycHJldCBvdXIgZGF0YS4gQ2xpY2sgb24gdGhlIGFycm93IG5leHQgdG8gdGhlIHdvcmQgKipHZW5lIFN5bWJvbCBBKiogYW5kIGZyb20gdGhlIG1lbnUgdGhhdCBhcHBlYXJzLCBzZWxlY3QgdGhlIGdyZWVuIGNpcmNsZS4gQ3J5cHRpY2FsbHksIHRoaXMgaWNvbiBtZWFucyAqKlNvdXJjZS4qKiBGb3IgdGhlICoqR2VuZSBTeW1ib2wgQioqIGNvbHVtbiwgZG8gdGhlIHNhbWUgdGhpbmcsIGJ1dCB0aGlzIHRpbWUgc2VsZWN0IHRoZSByZWQgYnVsbHNleWUsIHdoaWNoIG1lYW5zICoqVGFyZ2V0LioqCjxicj48L2JyPgo8YnI+PC9icj4KV2hlbiB5b3UndmUgY2hhbmdlZCBib3RoIGNvbHVtbnMsIGNsaWNrICoqT0suKioKCiFbXShpbWFnZXMvTmV0d29ya0ltcG9ydC5wbmcpCjxicj48L2JyPgo8YnI+PC9icj4KCgojIFlvdSBoYXZlIGEgKHZlcnkgY29uZnVzaW5nKSBuZXR3b3JrIQpJZiB0aGUgcHJldmlvdXMgc3RlcHMgd29ya2VkIHByb3Blcmx5LCB5b3Ugc2hvdWxkIGhhdmUgYSBuZXR3b3JrIG9mIGNvbm5lY3RlZCBub2Rlcy4gSWYgeW91IGhhdmUgbW9yZSB0aGFuIDEwMCBvciBzbywgdGhvdWdoLCB5b3VyIG5ldHdvcmsgd2lsbCBsb29rIGEgbG90IGxpa2UgYSBoYWlyYmFsbC4gV2UnbGwgdGFsayBhYm91dCB3YXlzIHRvIG1ha2UgeW91ciBuZXR3b3JrIGdyYXBoIG1vcmUgbGVnaWJsZSBpbiBzdWJzZXF1ZW50IHN0ZXBzLgo8YnI+PC9icj4KRm9yIG5vdywgbm90ZSB0aGF0IHlvdSBjYW4gem9vbSBpbiBvbiBwYXJ0cyBvZiB5b3VyIG5ldHdvcmsgdXNpbmcgdGhlIG1hZ25pZnlpbmcgZ2xhc3NlcyBvciB5b3VyIG1vdXNlLiBPbiBhIE1hYywgeW91IGNhbiBtb3ZlIHlvdXIgY2FudmFzIGFyb3VuZCBpZiB5b3UgaG9sZCBkb3duIHRoZSAqKmNvbW1hbmQqKiBrZXkgYW5kIGRyYWcuIFlvdSBjYW4gYWxzbyBzZWFyY2ggZm9yIGluZGl2aWR1YWwgbm9kZXMgYnkgdXNpbmcgdGhlIHNlYXJjaCBib3ggYXQgdGhlIHVwcGVyIHJpZ2h0IG9mIHRoZSB3aW5kb3cuICoqKE5vdGUgdGhhdCBDeXRvc2NhcGUgZG9lc24ndCB6b29tIHRvIHRoZSBub2RlIHlvdSBzZWFyY2hlZCBmb3IgcmlnaHQgYXdheTsgaXQganVzdCBoaWdobGlnaHRzIGl0IGluIHllbGxvdy4gWW91IG1heSBoYXZlIHRvIHpvb20gb3V0IHRvIHNlZSB0aGUgc2VsZWN0ZWQgbm9kZS4pLioqCiFbXShpbWFnZXMvQ29uZnVzZWRfTmV0d29yay5wbmcpCjxicj48L2JyPgo8YnI+PC9icj4KCiMgU3dpdGNoIHVwIHlvdXIgc3R5bGUKT25lIG9mIHRoZSBlYXNpZXN0IHdheXMgdG8gY2hhbmdlIHRoZSBsb29rIG9mIHlvdXIgbmV0d29yayBkaWFncmFtIGlzIHRvIHN3aXRjaCB0aGUgc3R5bGUgdXNpbmcgb25lIG9mIEN5dG9zY2FwZSdzIGJ1aWx0LWluIG9wdGlvbnMuIFRvIGRvIHRoYXQsIGNsaWNrIHRoZSAqKlN0eWxlKiogdGFiIG9uIHRoZSBjb250cm9sIHBhbmVsIGFuZCB0aGVuIGNob29zZSBvbmUgb2YgdGhlIG9wdGlvbnMgd2l0aCB3aGljaCB5b3UncmUgcHJlc2VudGVkLiBJIGRvbid0IGtub3cgaWYgSSBsb3ZlIGFueSBvZiB0aGVtLCBidXQgc29tZSBhcmUgbW9yZSBsZWdpYmxlIHRoYW4gb3RoZXJzLjxicj48L2JyPgo8YnI+PC9icj4KIVtdKGltYWdlcy9TdHlsZS10YWIucG5nKQo8YnI+PC9icj4KPGJyPjwvYnI+CgojIENoYW5nZSB5b3VyIGxheW91dApTb21ldGltZXMgbmV0d29ya3MgYXJlIG1vcmUgbGVnaWJsZSBpZiB5b3UgY2hhbmdlIHRoZSBhcnJhbmdlbWVudCBvZiB0aGUgbm9kZXMuIFlvdSBjYW4gZG8gdGhpcyBieSBzd2l0Y2hpbmcgdGhlIGxheW91dC4gQ2xpY2sgb24gKipMYXlvdXQqKiBmcm9tIEN5dG9zY2FwZSdzIG1lbnUgYmFyIGFuZCBzZWxlY3Qgb25lIG9mIHRoZSBsYXlvdXQgb3B0aW9ucy4gRXhwZXJpbWVudCB3aXRoIHZhcmlvdXMgbGF5b3V0cyBhbmQgbm90aWNlIGhvdyBkcmFzdGljYWxseSB5b3VyIG5ldHdvcmsgZGlhZ3JhbSBjaGFuZ2VzLgo8YnI+PC9icj4KPGJyPjwvYnI+CkNvbmZvdW5kaW5nbHksIGVhY2ggb2YgdGhlc2Ugd2lsZGx5IGRpZmZlcmVudCBuZXR3b3JrIGxheW91dHMgZGlzcGxheXMgdGhlIHNhbWUgYmFzaWMgaW5mb3JtYXRpb24uIEhvdyBjYW4gdGhpcyBiZT8gU2ltcGxlOiBJbiBtb3N0IG5ldHdvcmsgZ3JhcGhzLCB0aGUgcHJveGltaXR5IG9mIHR3byBub2RlcyBkb2Vzbid0IGluZGljYXRlIGFueXRoaW5nIGV4Y2VwdCBsZWdpYmlsaXR5LiBUaGlzIGNhbiBiZSByZWFsbHkgY29uZnVzaW5nLCBiZWNhdXNlIGNvZ25pdGl2ZWx5LCB3ZSBleHBlY3QgcHJveGltaXR5IHRvIGNvbnZleSBtZWFuaW5nZnVsIGluZm9ybWF0aW9uLiBJdCBqdXN0IGRvZXNuJ3QsIHRob3VnaCwgaW4gbW9zdCBuZXR3b3JrIGRpYWdyYW1zLiBUaGUgcHJlc2VuY2Ugb3IgYWJzZW5jZSBvZiBhbiBlZGdlIG1lYW5zIHNvbWV0aGluZywgYW5kIGNvbG9yIGFuZCBzaXplIG9mdGVuIGRvLCB0b28uIEJ1dCBwcm94aW1pdHkgZ2VuZXJhbGx5IGRvZXNuJ3QuCjxicj48L2JyPgo8YnI+PC9icj4KIVtdKGltYWdlcy9sYXlvdXQtY2hhbmdlLnBuZykKCjxicj48L2JyPgo8YnI+PC9icj4KCiMgQ3VzdG9taXplIHlvdXIgc3R5bGUKCllvdSBjYW4gbWFrZSBjaGFuZ2VzIHRvIG1hbnkgdmlzdWFsIGF0dHJpYnV0ZXMgb2YgeW91ciBuZXR3b3JrIGdyYXBoIGZyb20gQ3l0b3NjYXBlJ3MgY29udHJvbCBwYW5lbC4gT25jZSB5b3UndmUgc2VsZWN0ZWQgdGhlICoqU3R5bGUqKiB0YWIsIGxvb2sgYXQgdGhlIGJvdHRvbSBvZiB0aGUgY29udHJvbCBwYW5lbC4gWW91J2xsIHNlZSB0aGF0IHRocmVlIGFkZGl0aW9uYWwgYnV0dG9ucyBhbGxvdyB5b3UgdG8gY3VzdG9taXplIHRoZSBsb29rIG9mIHRoZSAqKm5vZGVzKiosIHRoZSAqKmVkZ2VzKiosIGFuZCB0aGUgKipuZXR3b3JrKiogYXMgYSB3aG9sZS4KPGJyPjwvYnI+Cjxicj48L2JyPgpMb29raW5nIGF0IHRoZSAqKk5vZGUqKiBzdHlsZSBwYW5lLCB5b3UnbGwgc2VlIHRoYXQgd2UgY2FuIGFsdGVyIG1hbnkgYXNwZWN0cyBvZiBvdXIgbm9kZXMsIGluY2x1ZGluZyB0aGVpciBib3JkZXIsIHRoZSBjb2xvciwgaGVpZ2h0LCBsYWJlbHMsIGV0Yy4gQnV0IHdoYXQgZG8gdGhlIHRocmVlIGNvbHVtbnMsIGxhYmVsZWQgKipEZWYuLCBNYXAuLCoqIGFuZCAqKkJ5cC4qKiBtZWFuPwo8YnI+PC9icj4KPGJyPjwvYnI+CioqRGVmLioqIHN0YW5kcyBmb3IgKipkZWZhdWx0Kio6IHRoZSBkZWZhdWx0IHZpc3VhbCBhdHRyaWJ1dGUgb2YgYSBub2RlLiBJZiB5b3UgY2xpY2sgb24gdGhlIGRlZmF1bHQgZmlsbCBjb2xvciBmb3IgeW91ciBuZXR3b3JrIGRpYWdyYW0sIGZvciBleGFtcGxlIChpbiB0aGUgaW1hZ2UgYmVsb3csIGl0J3MgYSBibHVlIHNxdWFyZSksIHlvdSdsbCBzZWUgdGhhdCB5b3UgY2FuIHN3YXAgb3V0IHRoZSBjb2xvcnMgb2YgeW91ciBuZXR3b3JrJ3Mgbm9kZXMuCjxicj48L2JyPgo8YnI+PC9icj4KKipCeXAuKiogc3RhbmRzIGZvciAqKmJ5cGFzcyoqLCBhbmQgaXQgYWxsb3dzIHlvdSB0byBhcHBseSBhIHN0eWxlIHRvIGEgZ3JvdXAgb2Ygbm9kZXMgdGhhdCB5b3Ugc2VsZWN0Lgo8YnI+PC9icj4KPGJyPjwvYnI+ClRoZSAqKk1hcC4qKiAobWFwcGluZykgY29sdW1uIGFsbG93cyB5b3UgdG8gY29udHJvbCB0aGUgdmlzdWFsIGZlYXR1cmVzIG9mIHlvdXIgbm9kZXMgYWNjb3JkaW5nIHRvIHRoZWlyIHByb3BlcnRpZXMuIEZvciBleGFtcGxlLCBsZXQncyBzYXkgeW91J2QgbGlrZSBhbGwgb2YgdGhlIGZpbG1zIGZyb20gYSBwYXJ0aWN1bGFyIHN0dWRpbyB0byBhcHBlYXIgaW4gcGluay4gWW91IGNhbiBkbyB0aGF0IGJ5IG1hcHBpbmcgdGhhdCBhdHRyaWJ1dGUgdG8gYSBwYXJ0aWN1bGFyIGNvbG9yLiBPciwgbGV0J3Mgc2F5IHlvdSdkIGxpa2UgdGhvc2Ugbm9kZXMgd2l0aCBtb3JlIGNvbm5lY3Rpb25zIHRvIGFwcGVhciBsYXJnZXIuIFlvdSBjYW4gZG8gdGhhdCB3aXRoIHRoZSBtYXBwaW5nIGNvbnRyb2wuCjxicj48L2JyPgo8YnI+PC9icj4KVGhlIHByb2JsZW0gaXMsIHdlIGRvbid0IGhhdmUgYW55IG9mIHRoYXQgaW5mb3JtYXRpb24gY3VycmVudGx5IGluY2x1ZGVkIGluIG91ciBuZXR3b3JrLiBTbyBpbiB0aGUgbmV4dCB0dXRvcmlhbCwgd2UnbGwgbG9vayBhdCBob3cgdG8gbG9hZCB1cCAqKmF0dHJpYnV0ZXMqKiBmb3Igb3VyIG5vZGVzLgo8YnI+PC9icj4KPGJyPjwvYnI+CihbT3IgeW91IGNhbiBza2lwIHN0cmFpZ2h0IHRvIHB1Ymxpc2hpbmcgeW91ciBuZXR3b3JrIGRpYWdyYW0hXShodHRwczovL2dpdGh1Yi5jb20vbWlyaWFtcG9zbmVyL2N5dG9zY2FwZV90dXRvcmlhbHMvYmxvYi9tYXN0ZXIvcHVibGlzaGluZy15b3VyLW5ldHdvcmstZGlhZ3JhbS5tZCkpIAoKCjxicj48L2JyPgo8YnI+PC9icj4KIVtdKGltYWdlcy9DdXN0b21pemVfU3R5bGVzLnBuZykKCgoKCjxicj48L2JyPgo8YnI+PC9icj4KCgojIFNhdmluZyB5b3VyIG5ldHdvcmsKQ3l0b3NjYXBlIHByb3ZpZGVzIGEgbnVtYmVyIG9mIHdheXMgdG8gc2F2ZSByZXN1bHRzIGFuZCB2aXN1YWxpemF0aW9uczoKQXMgYSBzZXNzaW9uOiAqKkZpbGUg4oaSIFNhdmUgU2Vzc2lvbiwgRmlsZSDihpIgU2F2ZSBTZXNzaW9uIEFzLi4uKioKPGJyPjwvYnI+Cjxicj48L2JyPgohW10oaW1hZ2VzL1NhdmVfU2Vzc2lvbi5wbmcpCjxicj48L2JyPgo8YnI+PC9icj4KCkFzIGFuIGltYWdlOiAqKkZpbGUg4oaSIEV4cG9ydCDihpIgTmV0d29yayB0byBJbWFnZS4uLioqCgo8YnI+PC9icj4KPGJyPjwvYnI+CiFbXShpbWFnZXMvRXhwb3J0X0ltYWdlLnBuZykKPGJyPjwvYnI+Cjxicj48L2JyPgohW10oaW1hZ2VzL1NpZl9Gb3JtYXQucG5nKQoKPGJyPjwvYnI+Cjxicj48L2JyPgpUbyB0aGUgd2ViOiAqKkZpbGUg4oaSIEV4cG9ydCDihpIgTmV0d29yayB0byBXZWIgUGFnZS4uLioqPGJyPjwvYnI+ClRvIGEgcHVibGljIHJlcG9zaXRvcnk6ICoqRmlsZSDihpIgRXhwb3J0IOKGkiBOZXR3b3JrIHRvIE5ERXgqKjxicj48L2JyPgpBcyBhIGdyYXBoIGZvcm1hdCBmaWxlOiAqKkZpbGUg4oaSIEV4cG9ydCDihpIgTmV0d29yayB0byBGaWxlLioqPGJyPjwvYnI+CgoqKkZvcm1hdHM6Kio8YnI+PC9icj4KLSBDWCBKU09OIC8gQ1gyIEpTT048YnI+PC9icj4KLSBDeXRvc2NhcGUuanMgSlNPTjxicj48L2JyPgotIEdyYXBoTUw8YnI+PC9icj4KLSBQU0ktTUk8YnI+PC9icj4KLSBYR01NTDxicj48L2JyPgotIFNJRjxicj48L2JyPgoKPGJyPjwvYnI+PGJyPjwvYnI+CgoKPGRpdiBjbGFzcz0iZXhlcmNpc2UiPgojIFRoaXMgaXMgdGhlIGV4ZXJjaXNlIHNlc3Npb24gLSBTdGlsbCBpbiBwcm9ncmVzcwoKPC9kaXY+Cgo8YnI+PC9icj48YnI+PC9icj4KCiMgUGFydCBCOgoKIyMgQXV0aG9yOiAqKkRyLiBBa3NoYXkgQmhhdCoqCiMjIExhc3QgbW9kaWZpZWQ6IDMxc3QgSmFuIDIwMjQKCgoKIyBSTkEtU2VxIERhdGEgTmV0d29yayBBbmFseXNpcwpDeXRvc2NhcGUgaXMgYW4gb3BlbiBzb3VyY2Ugc29mdHdhcmUgcGxhdGZvcm0gZm9yIGludGVncmF0aW5nLCB2aXN1YWxpemluZywgYW5kIGFuYWx5c2luZyBtZWFzdXJlbWVudCBkYXRhIGluIHRoZSBjb250ZXh0IG9mIG5ldHdvcmtzLjxicj48L2JyPgoKVGhpcyBwcm90b2NvbCBkZXNjcmliZXMgYSBuZXR3b3JrIGFuYWx5c2lzIHdvcmtmbG93IGluIEN5dG9zY2FwZSBmb3IgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIGZyb20gYW4gUk5BLVNlcSBleHBlcmltZW50LiBPdmVyYWxsIHdvcmtmbG93Ojxicj48L2JyPgoK4oCiCUZpbmRpbmcgYSBzZXQgb2YgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzLiA8YnI+PC9icj4K4oCiCVJldHJpZXZpbmcgcmVsZXZhbnQgbmV0d29ya3MgZnJvbSBwdWJsaWMgZGF0YWJhc2VzLiA8YnI+PC9icj4K4oCiCUludGVncmF0aW9uIGFuZCB2aXN1YWxpemF0aW9uIG9mIGV4cGVyaW1lbnRhbCBkYXRhLiA8YnI+PC9icj4K4oCiCU5ldHdvcmsgZnVuY3Rpb25hbCBlbnJpY2htZW50IGFuYWx5c2lzLiA8YnI+PC9icj4K4oCiCUV4cG9ydGluZyBuZXR3b3JrIHZpc3VhbGl6YXRpb25zLiA8YnI+PC9icj4KCgojIFNldHVwCgpJbnN0YWxsIHRoZSAoW3N0cmluZ0FwcF0oaHR0cDovL2FwcHMuY3l0b3NjYXBlLm9yZy9hcHBzL3N0cmluZ2FwcCkpIGZyb20gdGhlIEN5dG9zY2FwZSBBcHAgU3RvcmUsIG9yIHZpYSAqKkFwcHMg4oaSIEFwcCBTdG9yZSDihpIgU2hvdyBBcHAgU3RvcmUuKiogPGJyPjwvYnI+CgojIyBPUiA8YnI+PC9icj4KCkp1c3QgdmlzaXQgdGhlICoqQ3l0b3NjYXBlIEFwcCBzdG9yZSoqIGFuZCBpbnN0YWxsL2Rvd25sb2FkIGl0IGZyb20gdGhlcmUuCjxicj48L2JyPjxicj48L2JyPgohW10oaW1hZ2VzL1N0cmluZ0FwcC5wbmcpCjxicj48L2JyPjxicj48L2JyPgoKIyBFeHBlcmltZW50YWwgRGF0YQpGb3IgdGhpcyBleGVyY2lzZSwgd2Ugd2lsbCB1c2UgYSBkYXRhc2V0IGNvbXBhcmluZyB0cmFuc2NyaXB0b21pYyBkaWZmZXJlbmNlcyBiZXR3ZWVuIGJsYWRkZXIgY2FuY2VyIGFuZCBub3JtYWwgdGlzc3VlLiBUaGUgc3R1ZHkgaGFzIGJlZW4gcHVibGlzaGVkIGJ5IFJhZHZhbnlpIEYgZXQgYWwuLCBhbmQgd2Ugd2lsbCBnZXQgYSBzdW1tYXJpemVkIGRhdGFzZXQgd2l0aCBmb2xkIGNoYW5nZSBhbmQgcC12YWx1ZSBmcm9tIHRoZSAqKkVCSSBHZW5lIEV4cHJlc3Npb24gQXRsYXMqKi4gQXJyYXktZXhwcmVzcyBJRCBpcyAqKkUtTVRBQi0xOTQwKiouCjxicj48L2JyPgo8YnI+PC9icj4KCuKAoglEb3dubG9hZCB0aGUgZGF0YTogVHJhbnNjcmlwdG9taWMgYW5hbHlzaXMgb2YgYmxhZGRlciBjYW5jZXIgcmV2ZWFscyBjb252ZXJnZW50IG1vbGVjdWxhciBwYXRob2xvZ3kuIChbSGVyZS4uIV0oaHR0cHM6Ly9naXRodWIuY29tL2ExYWtzL0N5dG9zY2FwZV9Db3Vyc2UvYmxvYi9tYWluL0RhdGFfRmlsZXMvQkNMQS1hbGwudHN2KSkgPGJyPjwvYnI+CuKAoglUbyBvcGVuIHRoZSB0c3YgZGF0YWZpbGUgaW4gRXhjZWwsIGZpcnN0IGxhdW5jaCBFeGNlbCBhbmQgb3BlbiBhIGJsYW5rIHdvcmtib29rLiBOZXh0LCBnbyB0byAqKkRhdGEg4oaSIEdldCBFeHRlcm5hbCBEYXRhIOKGkiBJbXBvcnQgVGV4dCBGaWxlLi4uLioqIDxicj48L2JyPgrigKIJSW4gdGhlIGltcG9ydCB3aXphcmQsIHNlbGVjdCAqKkRlbGltaXRlZCoqIGFuZCBpbiB0aGUgbmV4dCBzdGVwIHNlbGVjdCBUYWIuCjxicj48L2JyPgrigKIJSW4gdGhlIHRoaXJkIHN0ZXAsIHlvdSBjYW4gc2VsZWN0IHRoZSAqKkRhdGEgRm9ybWF0KiogZm9yIGV2ZXJ5IGNvbHVtbi4gVGhlIGZpbGUgaGFzIDQgY29sdW1ucyBvZiBkYXRhOiAqKkdlbmUgSUQsIEdlbmUgTmFtZSwgZm9sZCBjaGFuZ2UgYW5kIHAtdmFsdWUqKi4gKipNYWtlIHN1cmUgdG8gY2hhbmdlIHRoZSBmb3JtYXQgZm9yIHRoZSBzZWNvbmQgY29sdW1uLCBHZW5lIE5hbWUsIHRvIFRleHQuKiogWW91IHdpbGwgaGF2ZSB0byBzY3JvbGwgdG8gdGhlIHJpZ2h0IHRvIHNlZSB0aGUgc2Vjb25kIGNvbHVtbi4KPGJyPjwvYnI+CuKAoglDbGljayAqKkZpbmlzaCoqIHRvIGNvbXBsZXRlIHRoZSBpbXBvcnQuCgo8YnI+PC9icj48YnI+PC9icj4KCiMjIEV4cGVyaW1lbnRhbCBEYXRhCldlIGFyZSBnb2luZyB0byBkZWZpbmUgYSBzZXQgb2YgdXAtcmVndWxhdGVkIGdlbmVzIGZyb20gdGhlIGZ1bGwgZGF0YXNldCBieSBmaWx0ZXJpbmcgZm9yIGZvbGQgY2hhbmdlIGFuZCBwLXZhbHVlLgo8YnI+PC9icj48YnI+PC9icj4K4oCiCVNlbGVjdCB0aGUgcm93IGNvbnRhaW5pbmcgZGF0YSB2YWx1ZSBoZWFkZXJzIChyb3cgNCkgYW5kIHNlbGVjdCAqKkRhdGEg4oaSIEZpbHRlci4qKjxicj48L2JyPgrigKIJSW4gdGhlIGRyb3AtZG93biBmb3IgdGhlIGZvbGQgY2hhbmdlIGNvbHVtbiwgc2V0IGEgZmlsdGVyIGZvciBmb2xkIGNoYW5nZSBncmVhdGVyIHRoYW4gMi4gVGhpcyBzaG91bGQgcmVzdWx0IGluICoqMjYzKiogZ2VuZXMuPGJyPjwvYnI+CuKAoglOZXh0LCBvbmUgd291bGQgbm9ybWFsbHkgZmlsdGVyIG91dCBub24tc2lnbmlmaWNhbnQgY2hhbmdlcyBieSBmaWx0ZXJpbmcgb24gdGhlIHAtdmFsdWUgYXMgd2VsbCwgZm9yIGV4YW1wbGUgc2V0dGluZyBwLXZhbHVlIGxlc3MgdGhhbiAwLjA1LiBCdXQgaW4gdGhpcyBjYXNlLCBhbGwgZ2VuZXMgd2l0aCBhIGZvbGQgY2hhbmdlIGdyZWF0ZXIgdGhhbiAyIGFscmVhZHkgbWVldCB0aGF0IGN1dG9mZi48YnI+PC9icj4K4oCiCVdpdGggdGhlIGZpbHRlciBhY3RpdmUsIHNlbGVjdCBhbmQgY29weSBhbGwgZW50cmllcyBpbiB0aGUgKipHZW5lIE5hbWUqKiBjb2x1bW4uPGJyPjwvYnI+Cjxicj48L2JyPjxicj48L2JyPgohW10oaW1hZ2VzL0V4cF9kYXRhLnBuZykKCjxicj48L2JyPjxicj48L2JyPgoKIyBSZXRyaWV2ZSBOZXR3b3JrcyBmcm9tIFNUUklORwoKVG8gaWRlbnRpZnkgYSByZWxldmFudCBuZXR3b3JrLCB3ZSB3aWxsIHVzZSB0aGUgKipTVFJJTkcqKiBkYXRhYmFzZSB0byBmaW5kIGEgbmV0d29yayByZWxldmFudCB0byB0aGUgbGlzdCBvZiB1cC1yZWd1bGF0ZWQgZ2VuZXMuCjxicj48L2JyPjxicj48L2JyPgrigKIJTGF1bmNoIEN5dG9zY2FwZS4gSW4gdGhlICoqTmV0d29yayBTZWFyY2gqKiBiYXIgYXQgdGhlIHRvcCBvZiB0aGUgKipOZXR3b3JrIFBhbmVsKiosIHNlbGVjdCAqKlNUUklORyBwcm90ZWluIHF1ZXJ5KiogZnJvbSB0aGUgZHJvcC1kb3duLCBhbmQgcGFzdGUgaW4gdGhlIGxpc3Qgb2YgMjYzIHVwLXJlZ3VsYXRlZCBnZW5lcy48YnI+PC9icj4K4oCiCU9wZW4gdGhlIG9wdGlvbnMgcGFuZWwgIGFuZCBjb25maXJtIHlvdSBhcmUgc2VhcmNoaW5nICoqSG9tbyBzYXBpZW5zKiogd2l0aCBhICoqQ29uZmlkZW5jZSBjdXRvZmYgb2YgMC40MCoqIGFuZCAqKjAgTWF4aW11bSBhZGRpdGlvbmFsIGludGVyYWN0b3JzLioqPGJyPjwvYnI+CuKAoglDbGljayB0aGUgKipzZWFyY2ggaWNvbioqIHRvIHNlYXJjaC4gSWYgYW55IG9mIHRoZSBzZWFyY2ggdGVybXMgYXJlIGFtYmlndW91cywgYSAqKlJlc29sdmUgQW1iaWd1b3VzIFRlcm1zKiogZGlhbG9nIHdpbGwgYXBwZWFyLiBDbGljayAqKkltcG9ydCoqIHRvIGNvbnRpbnVlIHdpdGggdGhlIGltcG9ydCB1c2luZyB0aGUgZGVmYXVsdCBjaG9pY2VzLiBUaGUgcmVzdWx0aW5nIG5ldHdvcmsgd2lsbCBsb2FkIGF1dG9tYXRpY2FsbHksIGFuZCBzaG91bGQgaGF2ZSBhcm91bmQgKioxNzMqKiBub2Rlcy4gPGJyPjwvYnI+Cgo8YnI+PC9icj4KCiFbXShpbWFnZXMvU3RyaW5nLUltcG9ydC5wbmcpCjxicj48L2JyPjxicj48L2JyPgoKIyBTVFJJTkcgTmV0d29yayBVcC1SZWd1bGF0ZWQgR2VuZXMKClRoZSByZXN1bHRpbmcgbmV0d29yayBjb250YWlucyB1cC1yZWd1bGF0ZWQgZ2VuZXMgcmVjb2duaXplZCBieSBTVFJJTkcsIGFuZCBpbnRlcmFjdGlvbnMgYmV0d2VlbiB0aGVtIHdpdGggYSBjb25maWRlbmNlIHNjb3JlIG9mIDAuNCBvciBncmVhdGVyLgo8YnI+PC9icj48YnI+PC9icj4KCiFbXShpbWFnZXMvU3RyaW5nLUltYWdlMS5wbmcpCgoKPGJyPjwvYnI+PGJyPjwvYnI+CgpUaGUgbmV0d29ya3MgY29uc2lzdCBvZiBvbmUgbGFyZ2UgY29ubmVjdGVkIGNvbXBvbmVudCwgc2V2ZXJhbCBzbWFsbGVyIG5ldHdvcmtzLCBhbmQgc29tZSB1bmNvbm5lY3RlZCBub2Rlcy4gV2Ugd2lsbCB1c2Ugb25seSB0aGUgbGFyZ2VzdCBjb25uZWN0ZWQgY29tcG9uZW50IGZvciB0aGUgcmVzdCBvZiB0aGUgdHV0b3JpYWwuPGJyPjwvYnI+CgrigKIJVG8gc2VsZWN0IHRoZSBsYXJnZXN0IGNvbm5lY3RlZCBjb21wb25lbnQsIHNlbGVjdCAqKlNlbGVjdCDihpIgTm9kZXMg4oaSIExhcmdlc3Qgc3VibmV0d29yay4qKjxicj48L2JyPgrigKIJU2VsZWN0ICoqRmlsZSDihpIgTmV3IE5ldHdvcmsg4oaSIEZyb20gU2VsZWN0ZWQgTm9kZXMsIEFsbCBFZGdlcy4qKjxicj48L2JyPgo8YnI+PC9icj48YnI+PC9icj4KIVtdKGltYWdlcy9TdHJpbmctSW1hZ2UyLnBuZykKCjxicj48L2JyPjxicj48L2JyPgoKIyBEYXRhIEludGVncmF0aW9uCgpOZXh0IHdlIHdpbGwgaW1wb3J0IHRoZSBSTkEtU2VxIGRhdGEgYW5kIHVzZSB0aGVtIHRvIGNyZWF0ZSBhIHZpc3VhbGl6YXRpb24uPGJyPjwvYnI+CgrigKIJTG9hZCB0aGUgZG93bmxvYWRlZCAqKkUtTVRBQi0xOTQwLXF1ZXJ5LXJlc3VsdHMudHN2KiogZmlsZSB1bmRlciBGaWxlIG1lbnUgYnkgc2VsZWN0aW5nICoqSW1wb3J0IOKGkiBUYWJsZSBmcm9tIEZpbGUuLi4uLioqIEFsdGVybmF0aXZlbHksIGRyYWcgYW5kIGRyb3AgdGhlIGRhdGEgZmlsZSBkaXJlY3RseSBvbnRvIHRoZSBOb2RlIFRhYmxlLjxicj48L2JyPgrigKIJSW4gKipBZHZhbmNlZCBPcHRpb25zKiouLi4sIGluIHRoZSAqKklnbm9yZSBMaW5lcyBTdGFydGluZyBXaXRoIGZpZWxkKiosIGVudGVyICMsIHRvIGV4Y2x1ZGUgdGhlIGFkZGl0aW9uYWwgbGluZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZGF0YSBmaWxlLjxicj48L2JyPgrigKIJU2VsZWN0IHRoZSAqKnF1ZXJ5IHRlcm0qKiBjb2x1bW4gYXMgdGhlICoqS2V5IGNvbHVtbiBmb3IgTmV0d29yayoqIGFuZCBzZWxlY3QgdGhlICoqR2VuZSBOYW1lKiogY29sdW1uIGFzIHRoZSBrZXkgY29sdW1uIGJ5IGNsaWNraW5nIG9uIHRoZSBoZWFkZXIgYW5kIHNlbGVjdGluZyB0aGUga2V5IHN5bWJvbC48YnI+PC9icj4K4oCiCUNsaWNrICoqT0sqKiB0byBpbXBvcnQuIFR3byBuZXcgY29sdW1ucyBvZiBkYXRhIHdpbGwgYmUgYWRkZWQgdG8gdGhlICoqTm9kZSBUYWJsZS4qKjxicj48L2JyPgoKPGJyPjwvYnI+PGJyPjwvYnI+CiFbXShpbWFnZXMvSW1wb3J0LWRhdGEtaW50LnBuZykKIVtdKGltYWdlcy9JbXBvcnQtQ29sdW1ucy5wbmcpCjxicj48L2JyPjxicj48L2JyPgoKCiMgVmlzdWFsaXphdGlvbgpOZXh0LCB3ZSB3aWxsIGNyZWF0ZSBhIHZpc3VhbGl6YXRpb24gb2YgdGhlIGltcG9ydGVkIGRhdGEgb24gdGhlIG5ldHdvcmsuIEZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIGRhdGEgdmlzdWFsaXphdGlvbiwgc2VlIHRoZSBWaXN1YWxpemluZyBEYXRhIHR1dG9yaWFsLjxicj48L2JyPgoK4oCiCUluIHRoZSAqKlN0eWxlKiogdGFiIG9mIHRoZSAqKkNvbnRyb2wgUGFuZWwqKiwgc3dpdGNoIHRoZSBzdHlsZSBmcm9tICoqU1RSSU5HKiogc3R5bGUgdG8gKipkZWZhdWx0KiogaW4gdGhlIGRyb3AtZG93biBhdCB0aGUgdG9wLjxicj48L2JyPgrigKIJQ2hhbmdlIHRoZSBkZWZhdWx0IG5vZGUgKipTaGFwZSoqIHRvICoqZWxsaXBzZSoqIGFuZCAqKmNoZWNrIExvY2sgbm9kZSB3aWR0aCBhbmQgaGVpZ2h0LioqPGJyPjwvYnI+CuKAoglTZXQgdGhlIGRlZmF1bHQgbm9kZSAqKlNpemUqKiB0byAqKjUwLioqPGJyPjwvYnI+CuKAoglTZXQgdGhlIGRlZmF1bHQgbm9kZSAqKkZpbGwgQ29sb3IqKiB0byAqKmxpZ2h0IGdyYXkqKi48YnI+PC9icj4K4oCiCVNldCB0aGUgZGVmYXVsdCAqKkJvcmRlciBXaWR0aCoqIHRvIDIsIGFuZCBtYWtlIHRoZSBkZWZhdWx0ICoqQm9yZGVyIFBhaW50KiogZGFyayBncmF5Ljxicj48L2JyPgo8YnI+PC9icj48YnI+PC9icj4KIVtdKGltYWdlcy9WaXN1YWxpemF0aW9uLVN0eWxlcy5wbmcpCgo8L2JyPjxicj48L2JyPjxicj48L2JyPgrigKIJRm9yIG5vZGUgKipGaWxsIENvbG9yKiosIGNyZWF0ZSBhIGNvbnRpbnVvdXMgbWFwcGluZyBmb3IgJ05NSUJDJyB2cyAnbm9ybWFsJyAuZm9sZENoYW5nZS48YnI+PC9icj4K4oCiCURvdWJsZS1jbGljayB0aGUgY29sb3IgbWFwcGluZyB0byBvcGVuIHRoZSAqKkNvbnRpbnVvdXMgTWFwcGluZyBFZGl0b3IqKiBhbmQgY2xpY2sgdGhlICoqQ3VycmVudCBQYWxldHRlKiouIFNlbGVjdCB0aGUgQ29sb3JCcmV3ZXIgKip5ZWxsb3ctb3JhbmdlLXJlZCBzaGFkZXMgZ3JhZGllbnQqKi48YnI+PC9icj4K4oCiCUZpbmFsbHksIGZvciBub2RlICoqTGFiZWwqKiwgc2V0IGEgcGFzc3Rocm91Z2ggbWFwcGluZyBmb3IgZGlzcGxheSBuYW1lLjxicj48L2JyPgrigKIJU2F2ZSB5b3VyIG5ldyB2aXN1YWxpemF0aW9uIHVuZGVyICoqQ29weSBTdHlsZS4uLioqIGluIHRoZSAqKk9wdGlvbnMqKiBtZW51IG9mIHRoZSAqKlN0eWxlKiogaW50ZXJmYWNlLCBhbmQgbmFtZSBpdCBkZSBnZW5lcyB1cC48YnI+PC9icj4KPGJyPjwvYnI+PGJyPjwvYnI+CiFbXShpbWFnZXMvU3R5bGUtb3B0aW9ucy5wbmcpCjxicj48L2JyPjxicj48L2JyPgoKCkFwcGx5IHRoZSAqKlByZWZ1c2UgRm9yY2UgRGlyZWN0ZWQqKiBsYXlvdXQgYnkgY2xpY2tpbmcgdGhlICoqQXBwbHkgUHJlZmVycmVkIExheW91dCoqIGJ1dHRvbiBpbiB0aGUgdG9vbGJhci4gVGhlIG5ldHdvcmsgd2lsbCBub3cgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgo8YnI+PC9icj48YnI+PC9icj4KIVtdKGltYWdlcy9QcmVmdXNlLWZvcmNlLWxheW91dC5wbmcpCjxicj48L2JyPjxicj48L2JyPgo8ZGl2IGNsYXNzPSJleGVyY2lzZSI+CiMgRXhlcmNpc2UKIyMgU1RSSU5HIEVucmljaG1lbnQKVGhlIFNUUklORyBhcHAgaGFzIGJ1aWx0LWluIGVucmljaG1lbnQgYW5hbHlzaXMgZnVuY3Rpb25hbGl0eSwgd2hpY2ggaW5jbHVkZXMgZW5yaWNobWVudCBmb3IgR2VuZSBPbnRvbG9neSwgSW50ZXJQcm8sIEtFR0cgUGF0aHdheXMsIGFuZCBQRkFNLjxicj48L2JyPgoK4oCiCVVzaW5nIHRoZSBTVFJJTkcgdGFiIG9mIHRoZSBSZXN1bHRzIFBhbmVsLCBjbGljayB0aGUgKipGdW5jdGlvbmFsIEVucmljaG1lbnQgYnV0dG9uKiouIEtlZXAgdGhlIGRlZmF1bHQgc2V0dGluZ3MuIFdoYXQgZG8geW91IHNlZS48YnI+PC9icj4KIVtdKGltYWdlcy9GdW5jdGlvbmFsRW5yaWNobWVudEJ1dHRvbi5wbmcpCgo8YnI+PC9icj48YnI+PC9icj4K4oCiCVdoZW4gdGhlIGVucmljaG1lbnQgYW5hbHlzaXMgaXMgY29tcGxldGUsIGEgbmV3IHRhYiB0aXRsZWQgKipTVFJJTkcqKiAqKkVucmljaG1lbnQqKiB3aWxsIG9wZW4gaW4gdGhlICoqVGFibGUgUGFuZWwqKi48YnI+PC9icj4KPGJyPjwvYnI+PGJyPjwvYnI+CiFbXShpbWFnZXMvVGFibGUtcGFuZS5wbmcpCjxicj48L2JyPjxicj48L2JyPgpUaGUgU1RSSU5HIGFwcCBpbmNsdWRlcyBzZXZlcmFsIG9wdGlvbnMgZm9yIGZpbHRlcmluZyBhbmQgZGlzcGxheWluZyB0aGUgZW5yaWNobWVudCByZXN1bHRzLiBUaGUgZmVhdHVyZXMgYXJlIGFsbCBhdmFpbGFibGUgYXQgdGhlIHRvcCBvZiB0aGUgKipTVFJJTkcgRW5yaWNobWVudCB0YWIqKi4gRmlsdGVyIHRoZSB0YWJsZSB0byBvbmx5IHNob3cgKipHTyBCaW9sb2dpY2FsIFByb2Nlc3MuKio8YnI+PC9icj4KCiMjIEFuc3dlcgrigKIJQXQgdGhlIHRvcCBsZWZ0IG9mIHRoZSBTVFJJTkcgZW5yaWNobWVudCB0YWIsIGNsaWNrIHRoZSBmaWx0ZXIgaWNvbiBgciBpY29uczo6Zm9udGF3ZXNvbWUoImZpbHRlciIsIHN0eWxlID0gInNvbGlkIilgIC4gU2VsZWN0ICoqR08gQmlvbG9naWNhbCBQcm9jZXNzKiogYW5kIGNoZWNrIHRoZSAqKlJlbW92ZSByZWR1bmRhbnQgdGVybXMgY2hlY2stYm94KiouIFRoZW4gY2xpY2sgKipPSy4qKjxicj48L2JyPgrigKIJTmV4dCwgYWRkIGEgc3BsaXQgZG9udXQgY2hhcnQgdG8gdGhlIG5vZGVzIHJlcHJlc2VudGluZyB0aGUgdG9wIHRlcm1zIGJ5IGNsaWNraW5nIG9uIDxicj48L2JyPgrigKIJRXhwbG9yZSBjdXN0b20gc2V0dGluZ3MgdmlhICAgaW4gdGhlIHRvcCByaWdodCBvZiB0aGUgU1RSSU5HIGVucmljaG1lbnQgdGFiLjxicj48L2JyPgo8YnI+PC9icj48YnI+PC9icj4KIVtdKGltYWdlcy9TdHJpbmctQmlvbG9naWNhbFByb2Nlc3MucG5nKQo8YnI+PC9icj48YnI+PC9icj4KCiMjIEV4cG9ydGluZyBOZXR3b3JrcwpDeXRvc2NhcGUgcHJvdmlkZXMgYSBudW1iZXIgb2Ygd2F5cyB0byBzYXZlIHJlc3VsdHMgYW5kIHZpc3VhbGl6YXRpb25zOiA8YnI+PC9icj4KCuKAoglBcyBhIHNlc3Npb246ICoqRmlsZSDihpIgU2F2ZSBTZXNzaW9uLCBGaWxlIOKGkiBTYXZlIFNlc3Npb24gQXMuLi4qKiA8YnI+PC9icj4K4oCiCUFzIGFuIGltYWdlOiAqKkZpbGUg4oaSIEV4cG9ydCDihpIgTmV0d29yayB0byBJbWFnZS4uLioqIDxicj48L2JyPgrigKIJQXMgYSBncmFwaCBmb3JtYXQgZmlsZTogKipGaWxlIOKGkiBFeHBvcnQg4oaSIE5ldHdvcmsgdG8gRmlsZS4qKiA8YnI+PC9icj4KKipGb3JtYXRzOioqIDxicj48L2JyPgoqKkNYIEpTT04gLyBDWDIgSlNPTioqIDxicj48L2JyPgoqKkN5dG9zY2FwZS5qcyBKU09OKiogPGJyPjwvYnI+CioqR3JhcGhNTCoqIDxicj48L2JyPgoKU2F2ZSBpbiBhbnkgb2YgdGhlIGZvcm1hdHMgYW5kIGJlIHJlYWR5IGZvciBwdWJsaXNoaW5nLgoKPC9kaXY+CgoKCjxicj48L2JyPjxicj48L2JyPjxicj48L2JyPjxicj48L2JyPgoK